﻿Imports DAL
Imports MainGUI.My.Resources

Public Class FQuotationDataInput

    ' Biến List chứa RowGuidQuotationDetails để sau khi người dùng
    ' Edit xong dữ liệu sẽ dùng nó để so sánh xem dòng nào Update/Delete/New
    Private _listOfRowGuidQuotationDetails As New List(Of Guid)

    Private _listOfUpdateRecords As New List(Of spQuotationDetailsType)
    Private _listOfNewRecords As New List(Of spQuotationDetailsType)
    Private _listOfDeleteRecords As New List(Of Guid)

    ''' <summary>
    ''' EVENT - btnOK_Click
    ''' </summary>
    Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click

        ' Chuyển kết quả người dùng đã nhập vào các List(Of T)
        Call ConvertResultToLists()

        ' Ẩn form
        Hide()
    End Sub


    ''' <summary>
    ''' Constructor
    ''' </summary>
    Public Sub New(ByVal listOfQuotationDetailsType As List(Of spQuotationDetailsType))

        InitializeComponent()

        InputData(listOfQuotationDetailsType)
        HandleSelectionChangedEventOfRichTextBoxes()

    End Sub


    ''' <summary>
    ''' PROCEDURE - Ánh xạ dữ liệu lên các RichTextBox
    ''' </summary>
    Private Sub InputData(ByVal listOfQuotationDetailsType As List(Of spQuotationDetailsType))

        'FUNC: Kỹ thuật liên kết List(Of T) với RichTextBox
        Dim listOfRequestProductIds As New List(Of String)
        Dim listOfQuantities As New List(Of Short)
        Dim listOfRaDiscounts As New List(Of Double)
        Dim listOfSprDiscounts As New List(Of Double)
        Dim listOfEgDiscounts As New List(Of Double)
        Dim listOfImportTax As New List(Of Double)

        'Làm mới lại List RowGuidQuotationDetails
        _listOfRowGuidQuotationDetails = New List(Of Guid)

        For Each obj In listOfQuotationDetailsType

            'Thêm vào RequestProductId
            listOfRequestProductIds.Add(obj.RequestProductId)

            'Thêm vào Quantity
            listOfQuantities.Add(obj.Quantity)

            'Thêm vào RADiscount
            listOfRaDiscounts.Add(obj.RADiscount)

            'Thêm vào SPRDiscount
            listOfSprDiscounts.Add(obj.SPRDiscount)

            'Thêm vào EGDiscount
            listOfEgDiscounts.Add(obj.EGDiscount)

            'Thêm vào Import Tax
            listOfImportTax.Add(obj.ImportTax)

            'Thêm vào RowGuidQuotationDetails
            _listOfRowGuidQuotationDetails.Add(obj.RowGuidQuotationDetails)

        Next

        rbxPartNumbers.Lines = listOfRequestProductIds.ToArray()

        'FUNC: Kỹ thuật chuyển mảng Double thành mảng String
        rbxQuantities.Lines = listOfQuantities.Select(Function(x) x.ToString()).ToArray()
        rbxRADiscounts.Lines = listOfRaDiscounts.Select(Function(x) x.ToString()).ToArray()
        rbxSPRDiscounts.Lines = listOfSprDiscounts.Select(Function(x) x.ToString()).ToArray()
        rbxEGDiscounts.Lines = listOfEgDiscounts.Select(Function(x) x.ToString()).ToArray()
        rbxImportTax.Lines = listOfImportTax.Select(Function(x) x.ToString()).ToArray()

    End Sub


    ''' <summary>
    ''' PROCEDURE - Chọn toàn bộ hàng trong RichTextBox được chỉ định
    ''' </summary>
    Public Sub SelectLine(ByVal richTextBox As RichTextBox, ByVal lineNumber As Integer, Optional ByVal firstLineNumberIsZero As Boolean = False)

        'FUNC: Phương pháp chọn toàn bộ hàng trong RichTextBox khi chỉ định Line Number
        If FirstLineNumberIsZero = False Then
            lineNumber = lineNumber - 1
        End If

        If lineNumber < 0 Then Exit Sub
        If lineNumber > richTextBox.Lines.Count Then Exit Sub

        richTextBox.HideSelection = False

        Dim start As Integer = richTextBox.GetFirstCharIndexFromLine(lineNumber)
        Dim length As Integer = richTextBox.Lines(lineNumber).Length
        richTextBox.SelectionStart = start
        richTextBox.SelectionLength = length

    End Sub


    ''' <summary>
    ''' PROCEDURE - Gán thủ tục RichTextBox_MouseClick cho Event rbxPartNumbers.MouseClick
    ''' </summary>
    Private Sub HandleSelectionChangedEventOfRichTextBoxes()

        'FUNC: Kỹ thuật gán một Procedure cho Event
        AddHandler rbxPartNumbers.MouseClick, AddressOf RichTextBox_MouseClick

    End Sub


    ''' <summary>
    ''' Chọn hàng tương  ứng trong các RichTextBox khi một Part-Number được chọn
    ''' </summary>
    Private Sub RichTextBox_MouseClick(sender As Object, e As MouseEventArgs)
        'FUNC: Phương pháp lấy Line Number của dòng đang được chọn trong RichTextBox
        Dim currentPosition As Integer
        Dim currentLine As Integer

        currentPosition = rbxPartNumbers.SelectionStart
        currentLine = rbxPartNumbers.GetLineFromCharIndex(currentPosition)


        'SelectLine(rbxPartNumbers, currentLine + 1)
        SelectLine(rbxQuantities, currentLine + 1)
        SelectLine(rbxRADiscounts, currentLine + 1)
        SelectLine(rbxSPRDiscounts, currentLine + 1)
        SelectLine(rbxEGDiscounts, currentLine + 1)
        SelectLine(rbxImportTax, currentLine + 1)
    End Sub


    ''' <summary>
    ''' Chuyển tất cả kết quả mà người dùng đã nhập vào các List(Of T)
    ''' </summary>
    Private Sub ConvertResultToLists()

        'Kiểm tra tính hợp lệ trong các TextBox
        If Not ValidateRichTexBoxes() Then
            Exit Sub
        End If


        ' Người dùng có thể thêm mới cũng có thể xóa bớt số 
        ' lượng Part Number
        ' Do đó, phải chọn giữa số lượng RowGuidQuotationDetails
        ' và số lượng Part Number
        Dim rg As Integer = _listOfRowGuidQuotationDetails.Count
        Dim pn As Integer = rbxPartNumbers.Lines.Count


        ' Nếu rg > pn : Người dùng cập nhật và xóa bớt Part Number
        If rg > pn Then

            ' Refresh lại _listOfUpdateRecords
            _listOfUpdateRecords = New List(Of spQuotationDetailsType)()

            ' Lặp từng Part Number
            For index As Integer = 0 To rbxPartNumbers.Lines.Count - 1

                Dim oQd As New spQuotationDetailsType

                oQd.RequestProductId = rbxPartNumbers.Lines(index)
                oQd.Quantity = CShort(rbxQuantities.Lines(index))
                oQd.RADiscount = CDbl(rbxRADiscounts.Lines(index))
                oQd.SPRDiscount = CDbl(rbxSPRDiscounts.Lines(index))
                oQd.EGDiscount = CDbl(rbxEGDiscounts.Lines(index))
                oQd.ImportTax = CDbl(rbxImportTax.Lines(index))

                oQd.RowGuidQuotationDetails = _listOfRowGuidQuotationDetails.Item(index)

                _listOfUpdateRecords.Add(oQd)

            Next

            ' Lúc đó, những RowGuidQuotationDetails còn lại là
            ' của các Record đã bị xóa

            ' Refresh lại _listOfDeleteRecord
            _listOfDeleteRecords = New List(Of Guid)

            ' Lặp với từng RowGuidQuotationDetails còn lại
            For index As Integer = rbxPartNumbers.Lines.Count To _listOfRowGuidQuotationDetails.Count - 1

                _listOfDeleteRecords.Add(_listOfRowGuidQuotationDetails(index))

            Next



        ElseIf rg = pn Then  ' Nếu rg = pn : Người dùng cập nhật tất cả các record

            ' Refresh lại _listOfUpdateRecords
            _listOfUpdateRecords = New List(Of spQuotationDetailsType)()

            ' Lặp từng Part Number
            For index As Integer = 0 To rbxPartNumbers.Lines.Count - 1

                Dim oQd As New spQuotationDetailsType

                oQd.RequestProductId = rbxPartNumbers.Lines(index)
                oQd.Quantity = CShort(rbxQuantities.Lines(index))
                oQd.RADiscount = CDbl(rbxRADiscounts.Lines(index))
                oQd.SPRDiscount = CDbl(rbxSPRDiscounts.Lines(index))
                oQd.EGDiscount = CDbl(rbxEGDiscounts.Lines(index))
                oQd.ImportTax = CDbl(rbxImportTax.Lines(index))

                oQd.RowGuidQuotationDetails = _listOfRowGuidQuotationDetails.Item(index)

                _listOfUpdateRecords.Add(oQd)

            Next

        Else ' Nếu rg < pn : Người dùng cập nhật các record và thêm record mới

            ' Refresh lại _listOfUpdateRecords
            _listOfUpdateRecords = New List(Of spQuotationDetailsType)

            ' Lặp từng RowGuidQuotationDetails
            For index As Integer = 0 To _listOfRowGuidQuotationDetails.Count - 1

                Dim oQd As New spQuotationDetailsType

                oQd.RequestProductId = rbxPartNumbers.Lines(index)
                oQd.Quantity = CShort(rbxQuantities.Lines(index))
                oQd.RADiscount = CDbl(rbxRADiscounts.Lines(index))
                oQd.SPRDiscount = CDbl(rbxSPRDiscounts.Lines(index))
                oQd.EGDiscount = CDbl(rbxEGDiscounts.Lines(index))
                oQd.ImportTax = CDbl(rbxImportTax.Lines(index))

                oQd.RowGuidQuotationDetails = _listOfRowGuidQuotationDetails.Item(index)

                _listOfUpdateRecords.Add(oQd)

            Next

            ' Refresh lại _listOfNewRecords
            _listOfNewRecords = New List(Of spQuotationDetailsType)

            ' Lặp từng line rbxPartNumbers còn lại
            For index As Integer = _listOfRowGuidQuotationDetails.Count To rbxPartNumbers.Lines.Count - 1

                Dim oQd As New spQuotationDetailsType

                oQd.RequestProductId = rbxPartNumbers.Lines(index)
                oQd.Quantity = CShort(rbxQuantities.Lines(index))
                oQd.RADiscount = CDbl(rbxRADiscounts.Lines(index))
                oQd.SPRDiscount = CDbl(rbxSPRDiscounts.Lines(index))
                oQd.EGDiscount = CDbl(rbxEGDiscounts.Lines(index))
                oQd.ImportTax = CDbl(rbxImportTax.Lines(index))

                _listOfNewRecords.Add(oQd)

            Next
        End If




    End Sub


    ''' <summary>
    ''' Kiểm tra tính hợp lệ của dữ liệu trong các RichTextBox
    ''' </summary>
    Private Function ValidateRichTexBoxes() As Boolean

        Dim check As Boolean

        'Kiểm tra tổng số hàng ở mỗi RichTextBox có bằng nhau không
        If (rbxPartNumbers.Lines.Count = rbxQuantities.Lines.Count) And _
           (rbxQuantities.Lines.Count = rbxRADiscounts.Lines.Count) And _
           (rbxRADiscounts.Lines.Count = rbxSPRDiscounts.Lines.Count) And _
           (rbxSPRDiscounts.Lines.Count = rbxEGDiscounts.Lines.Count()) And _
           (rbxEGDiscounts.Lines.Count() = rbxPartNumbers.Lines.Count) Then

            'Nếu không nhập Thuế nhập khẩu
            If chkImportTax.Checked Then
                check = True

            Else 'Nếu nhập Thuế nhập khẩu

                If rbxPartNumbers.Lines.Count = rbxImportTax.Lines.Count() Then
                    check = True
                Else
                    check = False
                End If

            End If

        Else
            check = False
        End If


        If Not check Then

            MessageBox.Show(fQuotationDataInput_Result_, _
                            ErrorFromUser, _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return False

        End If

        Return check

    End Function

    
    Public ReadOnly Property GetUpdateRecords() As List(Of spQuotationDetailsType)
        Get
            Return _listOfUpdateRecords
        End Get
    End Property


    Public ReadOnly Property GetNewRecords() As List(Of spQuotationDetailsType)
        Get
            Return _listOfNewRecords
        End Get
    End Property


    Public ReadOnly Property GetDeleteRecords() As List(Of Guid)
        Get
            Return _listOfDeleteRecords
        End Get
    End Property


End Class